In [1]:
!wget --no-check-certificate \
    https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
    -O /tmp/cats_and_dogs_filtered.zip
--2020-07-12 20:13:41--  https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip
Resolving storage.googleapis.com (storage.googleapis.com)... 172.217.194.128, 74.125.68.128, 2404:6800:4003:c04::80, ...
Connecting to storage.googleapis.com (storage.googleapis.com)|172.217.194.128|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 68606236 (65M) [application/zip]
Saving to: ‘/tmp/cats_and_dogs_filtered.zip’

/tmp/cats_and_dogs_ 100%[===================>]  65.43M  3.77MB/s    in 21s     

2020-07-12 20:14:04 (3.10 MB/s) - ‘/tmp/cats_and_dogs_filtered.zip’ saved [68606236/68606236]

In [2]:
import os
import zipfile
local_zip='/tmp/cats_and_dogs_filtered.zip'
zip_ref=zipfile.ZipFile(local_zip,'r')
zip_ref.extractall('/tmp')
zip_ref.close()
In [3]:
os.listdir('/tmp/cats_and_dogs_filtered')
Out[3]:
['validation', 'vectorize.py', 'train']
In [4]:
os.listdir('/tmp/cats_and_dogs_filtered/train')
Out[4]:
['dogs', 'cats']
In [5]:
print(len(os.listdir('/tmp/cats_and_dogs_filtered/train/dogs')))
print(len(os.listdir('/tmp/cats_and_dogs_filtered/train/cats')))
1000
1000
In [6]:
base_dir='/tmp/cats_and_dogs_filtered'
train_dir=os.path.join(base_dir,'train')
validation_dir=os.path.join(base_dir,'validation')

train_dogs_dir=os.path.join(train_dir,'dogs')
train_cats_dir=os.path.join(train_dir,'cats')

val_dogs_dir=os.path.join(validation_dir,'dogs')
val_cats_dir=os.path.join(validation_dir,'cats')
In [7]:
train_cats_filenames=os.listdir(train_cats_dir)
train_cats_filenames[:4]
Out[7]:
['cat.640.jpg', 'cat.217.jpg', 'cat.525.jpg', 'cat.369.jpg']
In [8]:
import matplotlib.pyplot as plt
%matplotlib inline
In [9]:
plt.imshow(plt.imread(os.path.join(train_cats_dir,train_cats_filenames[0])))
Out[9]:
<matplotlib.image.AxesImage at 0x7f83bfbb8310>
In [10]:
import random
In [11]:
images=[]
plt.figure(figsize=(16,16))
for i in range(16):
  plt.subplot(4,4,i+1)
  imgname=random.choice(train_cats_filenames)
  images.append(imgname)
  img=plt.imread(os.path.join(train_cats_dir,imgname))
  plt.imshow(img)
  plt.title(img.shape)
In [12]:
plt.figure(figsize=(16,16))
j=1
for i in images:
  img=plt.imread(os.path.join(train_cats_dir,i))
  plt.subplot(4,4,j)
  plt.hist(img.flat)
  j+=1
In [13]:
train_dogs_filenames=os.listdir(train_dogs_dir)
train_dogs_filenames[:4]
Out[13]:
['dog.681.jpg', 'dog.817.jpg', 'dog.252.jpg', 'dog.305.jpg']
In [14]:
dogs_images=[]
plt.figure(figsize=(16,16))
for i in range(16):
  plt.subplot(4,4,i+1)
  imgname=random.choice(train_dogs_filenames)
  dogs_images.append(imgname)
  img=plt.imread(os.path.join(train_dogs_dir,imgname))
  plt.imshow(img)
  plt.title(img.shape)
In [15]:
plt.figure(figsize=(16,16))
j=1
for i in dogs_images:
  img=plt.imread(os.path.join(train_dogs_dir,i))
  plt.subplot(4,4,j)
  plt.hist(img.flat)
  j+=1
In [16]:
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
val_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(train_dir,target_size=(150, 150),batch_size=20,class_mode='binary')

validation_generator = val_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=20,class_mode='binary')
Found 2000 images belonging to 2 classes.
Found 1000 images belonging to 2 classes.
In [17]:
img,labels=train_generator.next()
print(img.shape)
print(labels.shape)
(20, 150, 150, 3)
(20,)
In [18]:
plt.figure(figsize=(16,16))
for i in range(20):
  plt.subplot(4,5,i+1)
  plt.imshow(img[i,:,:,:])
  plt.title(labels[i])
  plt.axis("off")
In [19]:
## import required methods
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,Dense,Flatten,MaxPooling2D
In [20]:
model = Sequential()
## add a conv layer followed by maxpooling
model.add(Conv2D(16,3,activation='relu',input_shape=(150,150,3)))
model.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model.add(Conv2D(32,3,activation='relu',input_shape=(150,150,3)))
model.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model.add(Conv2D(64,3,activation='relu',input_shape=(150,150,3)))
model.add(MaxPooling2D(2))
# Convert the featuremap into 1D  array
model.add(Flatten())
# Fully connected layer with 512 neurons
model.add(Dense(512,activation='relu'))
## Final output layer
model.add(Dense(1,activation='sigmoid'))

#let us see the summary
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 148, 148, 16)      448       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 74, 74, 16)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 72, 72, 32)        4640      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 36, 36, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 34, 34, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 17, 17, 64)        0         
_________________________________________________________________
flatten (Flatten)            (None, 18496)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               9470464   
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 513       
=================================================================
Total params: 9,494,561
Trainable params: 9,494,561
Non-trainable params: 0
_________________________________________________________________
In [21]:
### Compiling the model
import tensorflow as tf

model.compile(loss=tf.keras.losses.BinaryCrossentropy(),metrics=['accuracy'])
In [22]:
history=model.fit(train_generator,epochs=15,validation_data=validation_generator,batch_size=32)
Epoch 1/15
100/100 [==============================] - 36s 362ms/step - loss: 0.7319 - accuracy: 0.5545 - val_loss: 0.6587 - val_accuracy: 0.6810
Epoch 2/15
100/100 [==============================] - 37s 369ms/step - loss: 0.6229 - accuracy: 0.6800 - val_loss: 0.6106 - val_accuracy: 0.6580
Epoch 3/15
100/100 [==============================] - 40s 405ms/step - loss: 0.5345 - accuracy: 0.7350 - val_loss: 0.6325 - val_accuracy: 0.6680
Epoch 4/15
100/100 [==============================] - 38s 376ms/step - loss: 0.4465 - accuracy: 0.7965 - val_loss: 0.5653 - val_accuracy: 0.7280
Epoch 5/15
100/100 [==============================] - 38s 376ms/step - loss: 0.3738 - accuracy: 0.8285 - val_loss: 0.5801 - val_accuracy: 0.7230
Epoch 6/15
100/100 [==============================] - 40s 399ms/step - loss: 0.2777 - accuracy: 0.8795 - val_loss: 0.7252 - val_accuracy: 0.7090
Epoch 7/15
100/100 [==============================] - 37s 368ms/step - loss: 0.1961 - accuracy: 0.9220 - val_loss: 0.8975 - val_accuracy: 0.6970
Epoch 8/15
100/100 [==============================] - 36s 359ms/step - loss: 0.1545 - accuracy: 0.9410 - val_loss: 1.0952 - val_accuracy: 0.6900
Epoch 9/15
100/100 [==============================] - 36s 358ms/step - loss: 0.1198 - accuracy: 0.9575 - val_loss: 0.9433 - val_accuracy: 0.7240
Epoch 10/15
100/100 [==============================] - 36s 360ms/step - loss: 0.0999 - accuracy: 0.9700 - val_loss: 1.0368 - val_accuracy: 0.7300
Epoch 11/15
100/100 [==============================] - 36s 361ms/step - loss: 0.0524 - accuracy: 0.9800 - val_loss: 1.4651 - val_accuracy: 0.7540
Epoch 12/15
100/100 [==============================] - 37s 367ms/step - loss: 0.0314 - accuracy: 0.9885 - val_loss: 2.1018 - val_accuracy: 0.6770
Epoch 13/15
100/100 [==============================] - 37s 370ms/step - loss: 0.0614 - accuracy: 0.9805 - val_loss: 1.6801 - val_accuracy: 0.7160
Epoch 14/15
100/100 [==============================] - 37s 366ms/step - loss: 0.0363 - accuracy: 0.9890 - val_loss: 1.6320 - val_accuracy: 0.7370
Epoch 15/15
100/100 [==============================] - 38s 375ms/step - loss: 0.0334 - accuracy: 0.9900 - val_loss: 3.2170 - val_accuracy: 0.6720
In [23]:
train_acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
train_loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = list(range(1,16))
plt.figure(figsize=(16,4))
plt.subplot(1,2,1)
plt.plot(epochs,train_acc,label='train_acc')
plt.plot(epochs,val_acc,label='val_acc')
plt.title('accuracy')
plt.legend()
plt.subplot(1,2,2)
plt.plot(epochs,train_loss,label='train_loss')
plt.plot(epochs,val_loss,label='val_loss')
plt.title('loss')
plt.legend()
Out[23]:
<matplotlib.legend.Legend at 0x7f83382a1e90>

With another model

In [24]:
model1 = Sequential()
## add a conv layer followed by maxpooling
model1.add(Conv2D(128,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model1.add(Conv2D(64,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model1.add(Conv2D(64,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model1.add(Conv2D(32,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
# Convert the featuremap into 1D  array
model1.add(Flatten())
# Fully connected layer with 512 neurons
model1.add(Dense(512,activation='relu'))
## Final output layer
model1.add(Dense(1,activation='softmax'))

#let us see the summary
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 148, 148, 16)      448       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 74, 74, 16)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 72, 72, 32)        4640      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 36, 36, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 34, 34, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 17, 17, 64)        0         
_________________________________________________________________
flatten (Flatten)            (None, 18496)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               9470464   
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 513       
=================================================================
Total params: 9,494,561
Trainable params: 9,494,561
Non-trainable params: 0
_________________________________________________________________
In [25]:
model1.compile(loss=tf.keras.losses.BinaryCrossentropy(),metrics=['accuracy'])
In [26]:
history1=model.fit(train_generator,epochs=7,validation_data=validation_generator,batch_size=32)
Epoch 1/7
100/100 [==============================] - 38s 381ms/step - loss: 0.1239 - accuracy: 0.9790 - val_loss: 1.9442 - val_accuracy: 0.7170
Epoch 2/7
100/100 [==============================] - 39s 389ms/step - loss: 0.0160 - accuracy: 0.9955 - val_loss: 2.0426 - val_accuracy: 0.7300
Epoch 3/7
100/100 [==============================] - 36s 360ms/step - loss: 0.0486 - accuracy: 0.9890 - val_loss: 2.2535 - val_accuracy: 0.7170
Epoch 4/7
100/100 [==============================] - 36s 358ms/step - loss: 0.0149 - accuracy: 0.9975 - val_loss: 2.2544 - val_accuracy: 0.7330
Epoch 5/7
100/100 [==============================] - 36s 355ms/step - loss: 0.0289 - accuracy: 0.9940 - val_loss: 2.8093 - val_accuracy: 0.6890
Epoch 6/7
100/100 [==============================] - 36s 357ms/step - loss: 0.0179 - accuracy: 0.9930 - val_loss: 2.3635 - val_accuracy: 0.7270
Epoch 7/7
100/100 [==============================] - 36s 358ms/step - loss: 0.0301 - accuracy: 0.9930 - val_loss: 2.6274 - val_accuracy: 0.7240
In [27]:
train_acc = history1.history['accuracy']
val_acc = history1.history['val_accuracy']
train_loss = history1.history['loss']
val_loss = history1.history['val_loss']
epochs = list(range(1,8))
plt.figure(figsize=(16,4))
plt.subplot(1,2,1)
plt.plot(epochs,train_acc,label='train_acc')
plt.plot(epochs,val_acc,label='val_acc')
plt.title('accuracy')
plt.legend()
plt.subplot(1,2,2)
plt.plot(epochs,train_loss,label='train_loss')
plt.plot(epochs,val_loss,label='val_loss')
plt.title('loss')
plt.legend()
Out[27]:
<matplotlib.legend.Legend at 0x7f832bfa2a10>